/* Пример программы для доступа к DS2430 */

/* Микроконтроллер  AT90S2313, шина 1-Wire  DS2430
   подключена к 0 биту PORTB (рис. 344) */

#include <90s2313.h> 	// подключаем заголовочный файл используемого 
					// микроконтроллера AVR

/* Перед подключением файла ds2430.h, объявим порт и бит порта, 
   используемые для подключения шины 1-Wire  */

/* Шина 1-Wire  подключена к 0 биту PORTB микроконтроллера AT90S2313 
   Адрес порта находим в файле 90s2313.h в строке: sfrb PORTB=0x18; */
#asm
.equ __w1_port=0x18
.equ __w1_bit=0
#endasm

/* Теперь можно подключать Функции EEPROM DS2430 */ 
#include <ds2430.h>

/* определим максимальное количество устройств DS2430, 
   которое может присутствовать на шине 1-Wire  */ 
#define max_number 8

/* распределим пространство SRAM для ROM кода устройств DS2430 и 
   бита статуса
   Для каждого устройства используется 9 байтов (смотри описание функции 
   w1_search в главе "Функции Протокола 1-Wire", стр. 414), но только первые
   8 байт содержат ROM код и CRC (контрольную сумму) */   
   
unsigned char cod_rom [max_number][9];

		int data_write=0x1234; 		// Объявляем и определяем целую переменную 						// data_write, значение которой будем
							// записывать во все EEPROM DS2430  
		int data_read [max_number]; 	// Объявляем целочисленный массив, в 
							// который будем считывать значения 
							// изо всех EEPROM DS2430  	
		#define address_0 1		// Определим (произвольно) начальный 
							// адрес памяти EEPROM DS2430, начиная с 
							// которого будем осуществлять операции 
							// записи и чтения   

/* Основная функция программы */ 

void main(void) 
{
		unsigned char i; 			// Объявляем индексную переменную i
		unsigned char number_DS2430; 	// Объявляем переменную number_DS2430,
							// где будет храниться количество
							// устройств DS2430, присутствующих
							// на шине 1-Wire 	

		/* инициализируем DS2430 устройства на шине 1-Wire функцией w1_init */
 
		if(w1_init())
		/* Следующие операторы в фигурных скобках будут выполняться, если
	   	   функция w1_init вернет значение, не равное 0, т.е., если на шине
	   	   1-Wire  присутствует ходя бы одно устройство DS2430 
	   	   (см. "Функции Протокола 1-Wire", стр. 414) */

		{					// открывающая скобка оператора if
			/* определим, сколько устройств DS2430 подключено к шине 1-Wire, 
   	   	   и сохраним их ROM коды в массиве cod_rom 
	   	   	   Для этого вызываем функцию w1_search с командой Search ROM 
	   	   	   (Поиск ROM кодов) (код - F0h)(см. "Функции Протокола 1-Wire",
 		   стр. 414) */
 
			number_DS2430=w1_search(0xf0,cod_rom); 	 
			
			/* теперь в переменной number_DS2430 хранится количество
		   	   устройств DS2430, присутствующих на шине 
		   	   1-Wire, а в массиве cod_rom их ROM коды */
	
				/* запишем значение data_write в каждую DS2430 */
				for (i=0;i<number_DS2430;i++)
				{ 				// открывающая скобка оператора for
				/* В функции ds2430_write_block:
				   поочередно выбираем ROM код каждого устройства(i) из				   массива cod_rom. В качестве указателя подставляем адрес
				   первого байта i-го ROM кода (&cod_rom[i][0]); 
				   записываемая строка - data_write. В качестве указателя
				   подставляем адрес (&data_write);
 			   запись начинаем с адреса address_0;
				   значение size=2, т.к. в целой 2 байта */

				ds2430_write_block(&cod_rom[i][0],&data_write,address_0,2);
				}				// закрывающая скобка оператора for

				/* считаем записанное значение из каждой DS2430 
				   в массив data_read */

				for (i=0;i<number_DS2430;i++)
				{ 				// открывающая скобка оператора for
					/* В функции ds2430_read_block:
				   	   поочередно выбираем ROM код каждого устройства(i) из			   	   массива cod_rom. В качестве указателя подставляем
     				   адрес первого байта i-го ROM кода (&cod_rom[i][0]);  
считанное значение записываем в соответствующую
переменную data_read[i], заполняя массив data_read.
В качестве указателя подставляем адрес
(&data_read[i]);  
  			   	   чтение начинаем с адреса address_0;
				   	   значение size=2, т.к. в целой 2 байта */

				    ds2430_read_block(&cod_rom[i,0],&data_read[i],address_0,2);
				}			// закрывающая скобка оператора for
			};				// закрывающая скобка оператора if 
			while (1); 			// заканчиваем программу бесконечным циклом
		}
